﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Chilis.Marketing.Common;
using System.Data.SqlClient;
using Chilis.Marketing.Business.Entity;
using System.Data;
using System.Globalization;

namespace Chilis.Marketing.Data.Access
{
    public class DAActividad : ConexionBD
    {
        #region ATRIBUTOS

        ChilisDataContext chilisDataContext = new ChilisDataContext();
        private SqlCommand cmd;

        #endregion

        #region CONSTRUCTOR
        #endregion

        #region PROPIEDADES
        #endregion

        #region METODOS

        /// <summary>
        /// Método              : insertarActividad
        /// Descripción         : Inserta Actividad en la BD
        /// Fecha Creacion      : 26/03/2012
        /// Creador             : TP2
        /// Ultimo en modificar : TP2
        /// Ultima modificacion : 26/03/2012
        /// </summary>
        /// <param name="actividadBE">Entidad que representa la Actividad</param>
        /// <param name="campanhaBE">Entidad que representa la Campaña</param>
        /// <param name="transaccionIniciada">Indicador de Transaccion Iniciada</param>
        /// <returns>Retorna el Id de la Actividad insertada</returns>
        public int? insertarActividad(BEActividad actividadBE,
                                     BECampanha campanhaBE,
                                     bool transaccionIniciada)
        {
            int? codInsertado = 0;

            try
            {
                int? tempEstadoActividad = (int)actividadBE.EstadoActividad;
                int? tempEstado = (int)actividadBE.Estado;
                decimal? tempCosto = (decimal)actividadBE.Costo;
                int? tempIdCampanha = null;
                if (campanhaBE != null)
                {
                    tempIdCampanha = campanhaBE.IdCampanha;
                }

                chilisDataContext.spInsertaActividad(ref codInsertado,
                                                     actividadBE.Nombre,
                                                     actividadBE.Descripcion,
                                                     actividadBE.FechaEstimadaInicio,
                                                     actividadBE.FechaEstimadaFin,
                                                     tempCosto,
                                                     tempEstadoActividad,
                                                     actividadBE.FechaRealInicio,
                                                     actividadBE.FechaRealFin,
                                                     tempIdCampanha,
                                                     tempEstado,
                                                     campanhaBE.Usuario);
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
            }
            return codInsertado;
        }


        /// <summary>
        /// Método              : modificarActividad
        /// Descripción         : Modifica Actividad en la BD
        /// Fecha Creacion      : 26/03/2012
        /// Creador             : TP2
        /// Ultimo en modificar : TP2
        /// Ultima modificacion : 26/03/2012
        /// </summary>
        /// <param name="actividadBE">Entidad que representa la Actividad</param
        /// <param name="campanhaBE">Entidad que representa la Campaña</param>
        /// <param name="transaccionIniciada">Indicador de Transacción Iniciada</param>
        /// <returns>Retorna un booleano que indica si se actualizo el registro</returns>
        public bool modificarActividad(BEActividad actividadBE,
                                       BECampanha campanhaBE,
                                       bool transaccionIniciada)
        {
            bool respuesta = true;

            try
            {
                int? tempEstadoActividad = (int)actividadBE.EstadoActividad;
                int? tempEstado = (int)actividadBE.Estado;
                decimal? tempCosto = (decimal)actividadBE.Costo;
                int? tempIdCampanha = null;
                if (campanhaBE != null)
                {
                    tempIdCampanha = campanhaBE.IdCampanha;
                }

                chilisDataContext.spModificaActividad(actividadBE.IdActividad,
                                                      actividadBE.Nombre,
                                                      actividadBE.Descripcion,
                                                      actividadBE.FechaEstimadaInicio,
                                                      actividadBE.FechaEstimadaFin,
                                                      tempCosto,
                                                      tempEstadoActividad,
                                                      actividadBE.FechaRealInicio,
                                                      actividadBE.FechaRealFin,
                                                      tempIdCampanha,
                                                      tempEstado,
                                                      campanhaBE.Usuario);
            }
            catch (Exception ex)
            {
                respuesta = false;
                throw ex;
            }
            finally
            {
            }
            return respuesta;
        }

        /// <summary>
        /// Método              : eliminarActividad
        /// Descripción         : Elimina Actividad en la BD
        /// Fecha Creacion      : 26/03/2012
        /// Creador             : TP2
        /// Ultimo en modificar : TP2
        /// Ultima modificacion : 26/03/2012
        /// </summary>
        /// <param name="actividadBE">Entidad que representa la Actividad</param>
        /// <param name="transaccionIniciada">Indicador de Transacción Iniciada</param>
        /// <returns>Retorna un booleano que indica si se actualizo el registro</returns>
        public bool eliminarActividad(BEActividad actividadBE,
                                      bool transaccionIniciada)
        {
            bool respuesta = true;

            try
            {
                int? tempEstado = (int)actividadBE.Estado;

                chilisDataContext.spEliminaActividad(actividadBE.IdActividad,
                                                     tempEstado,
                                                     actividadBE.Usuario);
            }
            catch (Exception ex)
            {
                respuesta = false;
                throw ex;
            }
            finally
            {
            }
            return respuesta;
        }


        /// <summary>
        /// Método              : actualizarEstadoActividad
        /// Descripción         : Actualiza Estado de la Actividad en la BD
        /// Fecha Creacion      : 26/03/2012
        /// Creador             : TP2
        /// Ultimo en modificar : TP2
        /// Ultima modificacion : 26/03/2012
        /// </summary>
        /// <param name="actividadBE">Entidad que representa la Actividad</param>
        /// <param name="transaccionIniciada">Indicador de Transacción Iniciada</param>
        /// <returns>Retorna un booleano que indica si se actualizo el registro</returns>
        public bool actualizarEstadoActividad(BEActividad actividadBE,
                                              bool transaccionIniciada)
        {
            bool respuesta = true;

            try
            {
                int? tempEstadoActividad = (int)actividadBE.EstadoActividad;

                chilisDataContext.spActualizaEstadoActividad(actividadBE.IdActividad,
                                                             tempEstadoActividad,
                                                             actividadBE.Usuario);
            }
            catch (Exception ex)
            {
                respuesta = false;
                throw ex;
            }
            finally
            {
            }
            return respuesta;
        }

        /// <summary>
        /// Método              : obtenerActividadPorId
        /// Descripción         : Obtiene la Entidad Actividad
        /// Fecha Creacion      : 26/03/2012
        /// Creador             : TP2
        /// Ultimo en modificar : TP2
        /// Ultima modificacion : 26/03/2012
        /// </summary>
        /// <param name="idActividad">Id Actividad</param>
        /// <returns>Retorna el Objeto que representa la Entidad Actividad</returns>
        public BEActividad obtenerActividadPorId(int idActividad)
        {
            DataSet ds = null;
            BEActividad actividadBE = null;
            this.Conexion();

            cmd = new SqlCommand();
            cmd.Connection = this.connection;
            this.AbrirConexion();

            cmd.CommandText = "spSelActividadPorId";
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.Clear();
            cmd.Parameters.Add(new SqlParameter("@pIdActividad", idActividad));

            try
            {
                cmd.ExecuteNonQuery();

                ds = new DataSet();
                SqlDataAdapter da = new SqlDataAdapter(cmd);
                da.Fill(ds);

                if (ds != null)
                {
                    actividadBE = this.poblarActividad(ds.Tables[(int)Constantes.ACTIVIDAD_DATOS.DATOS_GENERALES], actividadBE);
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                cmd.Dispose();
                this.CerrarConexion();
            }
            return actividadBE;
        }

        /// <summary>
        /// Método              : obtenerActividadPorRecursoRolId
        /// Descripción         : Obtiene la Entidad Actividad
        /// Fecha Creacion      : 26/03/2012
        /// Creador             : TP2
        /// Ultimo en modificar : TP2
        /// Ultima modificacion : 26/03/2012
        /// </summary>
        /// <param name="idRecursoRol">Id Rol Actividad</param>
        /// <returns>Retorna el Objeto que representa la Entidad Actividad</returns>
        public BEActividad obtenerActividadPorRecursoRolId(int idRecursoRol)
        {
            DataSet ds = null;
            BEActividad actividadBE = null;
            this.Conexion();

            cmd = new SqlCommand();
            cmd.Connection = this.connection;
            this.AbrirConexion();

            cmd.CommandText = "spSelActividadPorRolId";
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.Clear();
            cmd.Parameters.Add(new SqlParameter("@pIdRolActividad", idRecursoRol));

            try
            {
                cmd.ExecuteNonQuery();

                ds = new DataSet();
                SqlDataAdapter da = new SqlDataAdapter(cmd);
                da.Fill(ds);

                if (ds != null)
                {
                    actividadBE = this.poblarActividad(ds.Tables[(int)Constantes.ACTIVIDAD_DATOS.DATOS_GENERALES], actividadBE);
                    if (actividadBE != null)
                    {
                        DARecursoRol recursoRolDA = new DARecursoRol();
                        BERecursoRol recursoRolBE = null;
                        recursoRolBE = recursoRolDA.poblarRecursoRol(ds.Tables[(int)Constantes.ACTIVIDAD_DATOS.RECURSO], recursoRolBE);
                        if (recursoRolBE != null)
                        {
                            actividadBE.LRecurso = new List<BERecurso>();
                            actividadBE.LRecurso.Add(recursoRolBE);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                cmd.Dispose();
                this.CerrarConexion();
            }
            return actividadBE;
        }

        /// <summary>
        /// Método              : obtenerActividadPorRecursoMaterialId
        /// Descripción         : Obtiene la Entidad Actividad
        /// Fecha Creacion      : 26/03/2012
        /// Creador             : TP2
        /// Ultimo en modificar : TP2
        /// Ultima modificacion : 26/03/2012
        /// </summary>
        /// <param name="idRecursoMaterial">Id Recurso Material</param>
        /// <returns>Retorna el Objeto que representa la Entidad Actividad</returns>
        public BEActividad obtenerActividadPorRecursoMaterialId(int idRecursoMaterial)
        {
            DataSet ds = null;
            BEActividad actividadBE = null;
            this.Conexion();

            cmd = new SqlCommand();
            cmd.Connection = this.connection;
            this.AbrirConexion();

            cmd.CommandText = "spSelActividadPorMaterialId";
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.Clear();
            cmd.Parameters.Add(new SqlParameter("@pIdMaterialActividad", idRecursoMaterial));

            try
            {
                cmd.ExecuteNonQuery();

                ds = new DataSet();
                SqlDataAdapter da = new SqlDataAdapter(cmd);
                da.Fill(ds);

                if (ds != null)
                {
                    actividadBE = this.poblarActividad(ds.Tables[(int)Constantes.ACTIVIDAD_DATOS.DATOS_GENERALES], actividadBE);
                    if (actividadBE != null)
                    {
                        DARecursoMaterial recursoMaterialDA = new DARecursoMaterial();
                        BERecursoMaterial recursoMaterialBE = null;
                        recursoMaterialBE = recursoMaterialDA.poblarRecursoMaterial(ds.Tables[(int)Constantes.ACTIVIDAD_DATOS.RECURSO], recursoMaterialBE);
                        if (recursoMaterialBE != null)
                        {
                            actividadBE.LRecurso = new List<BERecurso>();
                            actividadBE.LRecurso.Add(recursoMaterialBE);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                cmd.Dispose();
                this.CerrarConexion();
            }
            return actividadBE;
        }

        /// <summary>
        /// Método              : poblarActividad
        /// Descripción         : Se encarga de poblar los datos obtenidos en la Entidad Actividad
        /// Fecha Creacion      : 26/03/2012
        /// Creador             : TP2
        /// Ultimo en modificar : TP2
        /// Ultima modificacion : 26/03/2012
        /// </summary>
        /// <param name="dtActividad">Resultado de la Búsqueda por Id</param>
        /// <param name="campanhaBE">Entidad que representa la Campanha</param>
        /// <returns>Retorna el Objeto que representa la Entidad Campanha</returns>
        public BEActividad poblarActividad(DataTable dtActividad, BEActividad actividadBE)
        {
            if (dtActividad != null && dtActividad.Rows.Count > 0)
            {
                if (actividadBE == null)
                {
                    actividadBE = new BEActividad();
                }
                DataRow drActividad = dtActividad.Rows[0];
                if (drActividad["id_actividad"] != DBNull.Value)
                {
                    int tempIdActividad = 0;
                    int.TryParse(drActividad["id_actividad"].ToString(), out tempIdActividad);
                    actividadBE.IdActividad = tempIdActividad;
                }
                if (drActividad["nombre"] != DBNull.Value)
                {
                    actividadBE.Nombre = drActividad["nombre"].ToString();
                }
                if (drActividad["descripcion"] != DBNull.Value)
                {
                    actividadBE.Descripcion = drActividad["descripcion"].ToString();
                }
                if (drActividad["fecha_estimada_ini"] != DBNull.Value)
                {
                    CultureInfo cultura = System.Globalization.CultureInfo.CreateSpecificCulture("es-PE");
                    DateTime tempFechaEstimadaIni;
                    DateTime.TryParse(drActividad["fecha_estimada_ini"].ToString(), cultura, System.Globalization.DateTimeStyles.None, out tempFechaEstimadaIni);
                    actividadBE.FechaEstimadaInicio = tempFechaEstimadaIni;
                }
                if (drActividad["fecha_estimada_fin"] != DBNull.Value)
                {
                    CultureInfo cultura = System.Globalization.CultureInfo.CreateSpecificCulture("es-PE");
                    DateTime tempFechaEstimadaFin;
                    DateTime.TryParse(drActividad["fecha_estimada_fin"].ToString(), cultura, System.Globalization.DateTimeStyles.None, out tempFechaEstimadaFin);
                    actividadBE.FechaEstimadaFin = tempFechaEstimadaFin;
                }
                if (drActividad["costo"] != DBNull.Value)
                {
                    double tempCosto = 0;
                    if (double.TryParse(drActividad["costo"].ToString(), out tempCosto))
                    {
                        actividadBE.Costo = tempCosto;
                    }
                }
                if (drActividad["estado_actividad"] != DBNull.Value)
                {
                    int tempEstadoActividad = 0;
                    int.TryParse(drActividad["estado_actividad"].ToString(), out tempEstadoActividad);
                    if (tempEstadoActividad > 0)
                    {
                        actividadBE.EstadoActividad = Constantes.ObtenerEnumEstadoActividad(tempEstadoActividad.ToString());
                    }
                }
                if (drActividad["fecha_real_ini"] != DBNull.Value)
                {
                    CultureInfo cultura = System.Globalization.CultureInfo.CreateSpecificCulture("es-PE");
                    DateTime tempFechaRealIni;
                    DateTime.TryParse(drActividad["fecha_real_ini"].ToString(), cultura, System.Globalization.DateTimeStyles.None, out tempFechaRealIni);
                    actividadBE.FechaRealInicio = tempFechaRealIni;
                }
                if (drActividad["fecha_real_fin"] != DBNull.Value)
                {
                    CultureInfo cultura = System.Globalization.CultureInfo.CreateSpecificCulture("es-PE");
                    DateTime tempFechaRealFin;
                    DateTime.TryParse(drActividad["fecha_real_fin"].ToString(), cultura, System.Globalization.DateTimeStyles.None, out tempFechaRealFin);
                    actividadBE.FechaRealFin = tempFechaRealFin;
                }
                if (drActividad["estado"] != DBNull.Value)
                {
                    int tempEstado = 0;
                    int.TryParse(drActividad["estado"].ToString(), out tempEstado);
                    actividadBE.Estado = Constantes.ObtenerEnumEstado(tempEstado.ToString());
                }
            }
            return actividadBE;
        }


        /// <summary>
        /// Función             : buscarActividades
        /// Descripción         : Busca las Actividades de acuerdo a los filtros configurados
        /// Fecha Creacion      : 26/03/2012
        /// Creador             : TP2
        /// Ultimo en modificar : TP2
        /// Ultima modificacion : 26/03/2012
        /// </summary>
        /// <param name="filtro">Entidad que representa la Actividad</param>
        /// <returns>Listado de Actividades de acuerdo al filtro especificado</returns>
        public DataTable buscarActividades(BEActividad filtro)
        {
            DataTable dt = new DataTable();
            SqlDataAdapter da = null;
            this.Conexion();
            cmd = new SqlCommand();
            cmd.Connection = this.connection;

            this.AbrirConexion();

            cmd.CommandText = "spListarActividad";
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.Clear();

            cmd.Parameters.Add(new SqlParameter("@pIdActividad", filtro.IdActividad));
            cmd.Parameters.Add(new SqlParameter("@pNombre", filtro.Nombre));
            cmd.Parameters.Add(new SqlParameter("@pDescripcion", filtro.Descripcion));
            cmd.Parameters.Add(new SqlParameter("@pEstado", filtro.Estado.ToString("D")));
            cmd.Parameters.Add(new SqlParameter("@pOrderBy", filtro.Order_by));
            cmd.Parameters.Add(new SqlParameter("@pDeForma", filtro.De_forma));

            try
            {
                da = new SqlDataAdapter(cmd);
                da.Fill(dt);
            }
            catch (Exception ex)
            {
                dt = null;
                throw ex;
            }
            finally
            {
                if (da != null)
                {
                    da.Dispose();
                }
                cmd.Dispose();
                this.CerrarConexion();
            }
            return dt;

        }


        /// <summary>
        /// Función             : obtenerRolesPorIdActividad
        /// Descripción         : Busca los Roles de acuerdo a los filtros configurados
        /// Fecha Creacion      : 26/03/2012
        /// Creador             : TP2
        /// Ultimo en modificar : TP2
        /// Ultima modificacion : 26/03/2012
        /// </summary>
        /// <param name="filtro">Entidad que representa la Actividad</param>
        /// <returns>Listado de Roles de acuerdo al filtro especificado</returns>
        public DataTable obtenerRolesPorIdActividad(int idActividad)
        {
            DataTable dt = new DataTable();
            SqlDataAdapter da = null;
            this.Conexion();
            cmd = new SqlCommand();
            cmd.Connection = this.connection;

            this.AbrirConexion();

            cmd.CommandText = "spSelRolActividadPorActividadId";
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.Clear();

            cmd.Parameters.Add(new SqlParameter("@pIdActividad", idActividad));

            try
            {
                da = new SqlDataAdapter(cmd);
                da.Fill(dt);
            }
            catch (Exception ex)
            {
                dt = null;
                throw ex;
            }
            finally
            {
                if (da != null)
                {
                    da.Dispose();
                }
                cmd.Dispose();
                this.CerrarConexion();
            }
            return dt;

        }


        /// <summary>
        /// Función             : obtenerMaterialesPorIdActividad
        /// Descripción         : Busca los Materiales de acuerdo a los filtros configurados
        /// Fecha Creacion      : 26/03/2012
        /// Creador             : TP2
        /// Ultimo en modificar : TP2
        /// Ultima modificacion : 26/03/2012
        /// </summary>
        /// <param name="filtro">Entidad que representa la Actividad</param>
        /// <returns>Listado de Materiales de acuerdo al filtro especificado</returns>
        public DataTable obtenerMaterialesPorIdActividad(int idActividad)
        {
            DataTable dt = new DataTable();
            SqlDataAdapter da = null;
            this.Conexion();
            cmd = new SqlCommand();
            cmd.Connection = this.connection;

            this.AbrirConexion();

            cmd.CommandText = "spSelMaterialActividadPorActId";
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.Clear();

            cmd.Parameters.Add(new SqlParameter("@pIdActividad", idActividad));

            try
            {
                da = new SqlDataAdapter(cmd);
                da.Fill(dt);
            }
            catch (Exception ex)
            {
                dt = null;
                throw ex;
            }
            finally
            {
                if (da != null)
                {
                    da.Dispose();
                }
                cmd.Dispose();
                this.CerrarConexion();
            }
            return dt;

        }

        /// <summary>
        /// Función             : obtenerRecursosPorIdActividad
        /// Descripción         : Busca los Materiales de acuerdo a los filtros configurados
        /// Fecha Creacion      : 26/03/2012
        /// Creador             : TP2
        /// Ultimo en modificar : TP2
        /// Ultima modificacion : 26/03/2012
        /// </summary>
        /// <param name="filtro">Entidad que representa la Actividad</param>
        /// <returns>Listado de Materiales de acuerdo al filtro especificado</returns>
        public DataSet obtenerRecursosPorIdActividad(int idActividad)
        {
            DataSet ds = new DataSet();
            SqlDataAdapter da = null;
            this.Conexion();
            cmd = new SqlCommand();
            cmd.Connection = this.connection;

            this.AbrirConexion();

            cmd.CommandText = "spSelRecursosPorActividadId";
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.Clear();

            cmd.Parameters.Add(new SqlParameter("@pIdActividad", idActividad));

            try
            {
                da = new SqlDataAdapter(cmd);
                da.Fill(ds);
            }
            catch (Exception ex)
            {
                ds = null;
                throw ex;
            }
            finally
            {
                if (da != null)
                {
                    da.Dispose();
                }
                cmd.Dispose();
                this.CerrarConexion();
            }
            return ds;

        }

        #endregion
    }
}
